iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0

今天也繼續繼續加油,繼續刷刷刷刷刷刷~
————————————我是可愛的題目分隔線————————————

題目1:Python 的類別內的關鍵字self 是什麼

Python的類別內的關鍵字self,是類別方法(method)中的一個特別的變數,用來代表所屬的物件本身,。
當我們定義一個類別方法時,必須在方法的參數列表中包含self,這樣在方法內部就可以通過self訪問該物件的屬性和其他方法。

簡而易之,言而簡之(好了可以了XD)
self就是讓我們在類別方法(method)內,可以操作和訪問一個物件的方式。
這樣做的好處是,每個物件可以有自己獨立的屬性和方法,不會互相干擾。

舉個例子:
https://ithelp.ithome.com.tw/upload/images/20240925/20168371gU4MrooPkT.png
https://ithelp.ithome.com.tw/upload/images/20240925/20168371tZB7To8wF1.png

** __init__是一個初始化方法,它使用self來設置每個Li實例的name和age屬性。
** play 方法中使用self.name來取得這個Li實際例子的名字,並印出他正在玩球的訊息。
因此,self就是指向方法所屬的具體物件,可以讓方法內部訪問,和操作這個物件的屬性,以及其他方法。

第1題結束。
————————————我是可愛的題目分隔線————————————

題目2:Python 的__init__ 是什麼

__init__是Python中的一個特殊方法,中文常稱為「初始化方法」或「建構子」。
當建立一個新物件時,這個方法就會自動被呼叫,用來初始化物件的屬性。

簡而易之,言而簡之(又來XD)
__init__可以在建立物件的同時設定初始值。
假設我要設計一個「我」的類別(偏廣義層面),那「我」有名字和年齡這兩個屬性。當我再建立另一個人設的時候,我會希望這個人設跟「我」是連結在一起的。__init__就是「我」被建立的時候,把人設的資料傳進去的地方。
https://ithelp.ithome.com.tw/upload/images/20240925/201683711DBncx43J3.png
https://ithelp.ithome.com.tw/upload/images/20240925/20168371Ny2n8pYVqg.png

第2題結束。
————————————我是可愛的題目分隔線————————————

題目3:說明Python的封裝(encapsulation)

封裝(encapsulation)在Python中是一種面向對象程式設計(OOP)的概念。->>>面向對象程式設計(OOP)下面會再解釋。
封裝(encapsulation)指的是將物件的屬性/變數,和方法/函數隱藏起來,並且只能通過特定的接口(例如方法)來訪問和修改,從而保護數據的完整性和安全性。

簡單來說,封裝(encapsulation)就像是把物件的內部細節包裝起來,只顯示出需要使用的東西給外部。
這樣做是為了防止外部代碼直接修改到物件的內部數據。

舉個例子:
https://ithelp.ithome.com.tw/upload/images/20240925/201683712udsZ7h3GA.png
https://ithelp.ithome.com.tw/upload/images/20240925/201683718hUsTe9CyU.png

不跑”年齡必須要是正數和整數”:
https://ithelp.ithome.com.tw/upload/images/20240925/20168371fnG3NrMkp7.png
https://ithelp.ithome.com.tw/upload/images/20240925/20168371zxb7udHAXD.png

在這個例子中,__age是一個私有屬性,外部程式碼無法直接訪問或是修改它,只能透過get_age和set_age方法操作。
這樣就完成了數據的封裝和保護。

**面向對象程式設計(OOP)指的是一種自然且直觀的程式設計方式。將程式碼結構化成物件,讓程式碼更容易閱讀,且容易維護,又能貼近人類對現實世界的理解。
它將程式設計的重點放在物件上,而不是一連串的指令或函數。意思就是,OOP把現實世界中的事物(例如人、動物、車等)當作城市中的「物件」來處理,讓每個「物件」都有自己的屬性/特性和行為/功能。可以互相配合,組成更複雜的系統。

第3題結束。
————————————我是可愛的題目分隔線————————————

題目4:在Python裡,變數名稱有前單底線,例如:_test,並請說明適用時機

前面有單底線的變數名稱通常表示這個變數是「私有」的,不希望外部程式碼直接存取。
這是一種約定俗成的方式,讓其他人知道這個變數不應該被直接使用或修改,但 Python 本身不會強制執行這個約定。

舉個例子:
https://ithelp.ithome.com.tw/upload/images/20240925/201683711iGiM6LGOv.png
https://ithelp.ithome.com.tw/upload/images/20240925/20168371XcZ3lujTpJ.png
在這裡,_test 是一個「內部」變數,不建議從類別外部直接使用它。

第4題結束。
————————————我是可愛的題目分隔線————————————

題目5:在Python裡,變數名稱有後單底線,例如:dict_,並請說明適用時機

變數名稱後面有單底線通常是為了避免和 Python 的內建關鍵字或標準庫中的名稱衝突。
比如,如果我想使用 dict 這個名稱,但因為 dict 是 Python 的內建函式,我就可以使用 dict_ 來避免衝突:
https://ithelp.ithome.com.tw/upload/images/20240925/20168371T92i14talj.png
這樣可以避免和內建的 dict 函數發生混淆。

第5題結束。
————————————我是可愛的題目分隔線————————————

題目6:在Python裡,變數名稱前後有雙底線,例如:test,並請說明適用時機

前後都有雙底線的變數名稱(稱為「魔法方法」或「特殊方法」)通常用於 Python 的內部實作,另外像是 initstr 等。
這些方法具有特殊的意義,可以定義對象的行為。
這些名稱是 Python 的內部規範的一部分,不建議自定義這種名稱來避免干擾內部實作。

在Python裡,__test__是一個特殊的字典,主要用在單元測試工具「doctest」中。可以手動定義一些要測試的範例程式碼,這些範例程式碼不一定要出現在函數的文檔字串中,可以是任何工程師想要測試的程式碼。

舉個例子:
https://ithelp.ithome.com.tw/upload/images/20240925/20168371NyRdQfTICw.png
我第17有故意寫錯-3 + -3 = -2,印出的結果就會呈現下方的圖:直接幫我測試出來應該要輸出的結果應該要長什麼樣(-6)。
https://ithelp.ithome.com.tw/upload/images/20240925/20168371jNB8cSQI0v.png
當我修正好答案時,就會印出以下圖示:
https://ithelp.ithome.com.tw/upload/images/20240925/20168371rZfAZby6R0.png
** if name == “main”:
這行程式碼的意思是指,確保他這行以下的程式碼只有在模組被直接執行時才會運行。
** import doctest >>>導入doctest模組
** doctest.testmod() >>>呼叫doctest.testmod() ,它會自動模組中的所有文檔字串,並執行其中的測試範例,並執行檢查他們的輸出是否與預期結果一致。

**doctest是一個用來測試Python程式碼的模組,透過解析文檔字串中的範例進行測試,執行這些範例確保他們的輸出與預期結果一致。

另外也用__init__、__str__舉例:
https://ithelp.ithome.com.tw/upload/images/20240925/20168371cbp7pHSeAC.png
https://ithelp.ithome.com.tw/upload/images/20240925/201683718uAvEnJ0CD.png
print(obj) # 使用 str 方法顯示自定義的字串表示。

第6題結束。
————————————我是可愛的題目分隔線————————————

題目7:在Python裡,變數名稱有前雙底線,例如:__test,並請說明適用時機

變數名稱前有雙底線的變數會觸發「名稱改編」(name mangling),這是一種機制,使得變數名稱在內部被重新命名以防止子類別覆蓋。
這意味著 Python 會把 __test 變數名稱改編成 _ClassName__test 形式:
https://ithelp.ithome.com.tw/upload/images/20240925/20168371wrdxSxDTvD.png
https://ithelp.ithome.com.tw/upload/images/20240925/20168371LsPrtkFNOY.png
其中print(obj._MyClass__private_var) # 使用改編後的名稱來存取
但因為obj._MyClass__private_var有出現紅線,查了相關訊息說是我的編輯器的名稱解析功能有問題,或是其他靜態代碼分析工具的誤報,這點還不是很清楚...但因為可以順利印出我要的答案,所以先暫放一邊,有哪位大大知曉的話,敬請不吝告知,感溫感溫!

這種方法主要是防止類別中的變數名稱與子類別中的名稱發生衝突,但仍然可以被訪問,只是不那麼直觀。

第7題結束。
————————————我是可愛的題目分隔線————————————

題目8:在IDLE 環境使用Python 時,單底線有何特別意義

在 Python 的交互式環境(如 IDLE)中,單底線 _ 有特別的意義。
它用來保存上一次運算的結果。例如:
"""

3 + 4
7
_
7
"""
在這個例子中,單底線 _ 保存了上一次計算的結果 7。
這對於快速檢查上一個計算結果非常方便。

第8題結束。
————————————我是可愛的題目分隔線————————————

題目9:說明在Python裡請說明join( ) 方法

join( )方法指的是把一個列表或其他可以一起迭代的物件中的元素,合併成一個單一的字串。
join( )方法很適合用來處理文本和製作格式化的輸出。

舉個例子:
假設有一個包含三個單字的列表,並把這三個單字連接成一個以空格分隔的句子:
https://ithelp.ithome.com.tw/upload/images/20240925/20168371sxM5Gn4G0Q.png
這裡join(words)的意思是用空格’ ‘,把words列表中的每個字母連起來,產生一個新的字串。
’ ’裡面要放其他東西(像是,逗號)也可以。
https://ithelp.ithome.com.tw/upload/images/20240925/201683713U42tzdyqv.png
第9題結束。
————————————我是可愛的題目分隔線————————————

題目10:說明在Python裡sort( ) 和sorted( ) 方法的區別

如果在Python中需要對列表進行排序時,可以使用sort( )或sorted( )方法。
這兩個的差別如下:
sort( )
功能:直接對原始列表進行排序,且不會返回新列表,不用使用return,直接在原始列表上進行修改的意思。
舉個例子:
https://ithelp.ithome.com.tw/upload/images/20240925/20168371RkGfuU9OxN.png
https://ithelp.ithome.com.tw/upload/images/20240925/20168371WIIxNxBmPs.png
sorted( )
功能:返回一個新的已排序列表,原始列表不會被修改到。
舉個例子:
https://ithelp.ithome.com.tw/upload/images/20240925/20168371moLk1nzt0n.png
https://ithelp.ithome.com.tw/upload/images/20240925/20168371DxWG5NYuek.png
總結

  • 使用 sort() 方法會直接修改原列表,並且沒有返回值
  • 使用 sorted() 函數會返回一個新的已排序列表,原列表保持不變

第10題結束。
---距離集滿300題還剩190題---


上一篇
第十天刷題
下一篇
第十二天刷題
系列文
Python 新手入門:挑戰30天刷完300題14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言